package cn.z2huo.productcenter.management.app.code;

import cn.hutool.crypto.digest.DigestUtil;
import cn.z2huo.productcenter.management.enums.CodeTypeEnum;
import cn.z2huo.productcenter.util.SnowflakeGenerateUtils;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.util.Assert;

import java.util.Objects;

/**
 * <p>
 *
 * @author z2huo
 */
@Slf4j
@Component
@RequiredArgsConstructor
public class Md5CodeGenerator implements CodeGenerator {

    /**
     * <p>生成业务代码
     * <p>将雪花算法使用 md5 进行处理，生成 16 位 16 进制串之后在头部拼接单号类型
     *
     * @param typeEnum  业务代码类型
     */
    @Override
    public String generate(CodeTypeEnum typeEnum) {
        Assert.notNull(typeEnum, "业务代码类型不能为空");
        try {
            String snow = SnowflakeGenerateUtils.getSnowflake(SNOWFLAKE_KEY).nextIdStr();
            String code = typeEnum.getValue() + DigestUtil.md5Hex16(snow);
            return Objects.requireNonNull(code);
        } catch (Exception e) {
            log.error("生成业务代码失败，类型为 {}", typeEnum.getValue(), e);
            throw e;
        }
    }
}
